package com.example.shiro.session;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionContext;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;



public class TokenWebSessionManager extends DefaultWebSessionManager {


    public static final String SESSION_ID_TOKEN_NAME = "SESSION-TOKEN";

    /**
     * 获取SessionId，在获取Session时调用，你可以认为这是一个键值对 SessionId => Session
     * 获取到SessionId也就代表你获取到Session了
     * @param request 请求
     * @param response 响应
     * @return
     */
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        //从请求头中获取SESSION-TOKEN并放置到request attribute中
        Serializable id = ((HttpServletRequest) request).getHeader(SESSION_ID_TOKEN_NAME);
        request.setAttribute(SESSION_ID_TOKEN_NAME,id);
        return id;
    }


    /**
     * Session生成后的通知方法，在这一步我们添加SessionId到请求中去
     * 以免我们在Controller的方法中获取不到
     * @param session 生成后的Session
     * @param context Session的上下文，包含Subject，用户信息等
     */
    @Override
    protected void onStart(Session session, SessionContext context) {
        //判断是否是一个http的上下文
        if (!WebUtils.isHttp(context)) {
            return;
        }
        //将生成的SESSION-TOKEN放入到request attribute中，你可以在Controller返回它
        HttpServletRequest request = WebUtils.getHttpRequest(context);
        request.setAttribute(SESSION_ID_TOKEN_NAME,session.getId().toString());
    }
}
